home *** CD-ROM | disk | FTP | other *** search
- /* $Id: national.c,v 1.5 1993/11/19 02:11:10 ppessi Exp $
- *
- * national.c --- handle national fonts and keyboard layouts
- *
- * Author: ppessi <Pekka.Pessi@hut.fi>
- *
- * Copyright (c) 1993 Pekka Pessi
- *
- * Created : Mon Mar 29 06:32:31 1993 ppessi
- * Last modified: Fri Nov 19 04:08:36 1993 ppessi
- *
- */
-
- #include <string.h>
- #include <ctype.h>
-
- #include "nifty.h"
- #include "amiga.h"
- #include "national.h"
-
- #define CHARSETSIZE 256
-
- struct KeyMap *myKeyMap = NULL;
-
- unsigned char national_table[CHARSETSIZE];
- unsigned char national_kmap[CHARSETSIZE];
-
- struct nation nations[MAX_NATIONS] =
- {
- { "ASCII", "usa1", NULL, NULL },
- { "Danish", "dk", NULL,
- /* Danish I [Æ]Å\Ø{æ}å|ø */
- "[\306]\305\\\330{\346}\345|\370" },
- { "Finnish", "s", NULL,
- /* [Ä]Å\Ö{ä}å|ö */
- "[\304]\305\\\326{\344}\345|\366" },
- { "French", "f", NULL,
- /* @à[°\ç]§{é|ù}è~¨ */
- "@\340[\227\\\337]\305{\351|\371}\350~\250" },
- { "German", "d", NULL,
- /* @§[Ä]Ü\Ö{ä}ü|ö~ß */
- "@\247[\304]\334\\\326{\344}\374|\366~\337" },
- { "Norwegian", "n", NULL,
- /* $¤@É[Æ]Å\Ø^Ü`é{æ}å|ø~ü */
- "$\244@\311[\306]\305\\\330^\334`\351{\346}\345|\370~\374" },
- { "Swedish", "s", NULL,
- /* $¤@É[Ä]Å\Ö^Ü`é{ä}å|ö~ü */
- "$\244@\311[\304]\305\\\326^\334`\351{\344}\345|\366~\374" },
- { "UK", "gb", NULL,
- /* british #£*/
- "#\243" }
- }; /* ASCII */
-
- struct nation *used_nation = NULL;
- short no_nation = 7;
-
- unsigned char *kmap_template =
- "\000\001\002\003\004\005\006\007"
- "\010\011\012\013\014\015\016\017"
- "\020\021\022\023\024\025\026\027"
- "\030\031\032\033\034\035\036\037"
- " !c#$Y|#@ca\"--r-o+23'uP.,1o\" ?"
- "AAAAAAACEEEEIIIIDNOOOOO*OUUUUYTs"
- "aaaaaaaceeeeiiiidnooooo/ouuuuyty";
-
- /*
- * initialize current mapping
- */
- void
- init_national(unsigned int n)
- {
- int i;
- const unsigned char *patch;
-
- if (n >= no_nation)
- return;
-
- if (used_nation == nations + n)
- return;
-
- used_nation = nations + n;
-
- for (i = 0; i < CHARSETSIZE; i++) {
- national_kmap[i] = national_table[i] = i;
- }
-
- /* Set the keymap */
- if (used_nation->n_kmap)
- myKeyMap = used_nation->n_kmap;
- else if (used_nation->n_kmapname)
- myKeyMap = used_nation->n_kmap = FindKeyMap(used_nation->n_kmapname);
-
- /* patch send & receive tables */
- memcpy(national_kmap + 128, kmap_template, 128);
- for (patch = used_nation->n_patches; patch && *patch; patch += 2) {
- national_kmap[patch[1]] = patch[0];
- national_table[patch[0]] = patch[1];
- }
- }
-
- /*
- * Set the nation by name
- */
- void
- setnationbyname(char *name)
- {
- int i = no_nation - 1;
- while(i >= 0) {
- if (!Stricmp(nations[i].n_name, name)) {
- init_national(i);
- return;
- }
- i--;
- }
- if (i < 0)
- puts("National code not found");
- }
-
- /*
- * Parse national resources
- */
- void
- natinit(void)
- {
- char *temp;
-
- if ((temp = getprofile(PROGNAME ".nation")) != NULL) {
- setnationbyname(temp);
- } else {
- init_national(0);
- }
-
- if ((temp = getprofile(PROGNAME ".keymap")) != NULL ||
- (temp = getprofile(PROGNAME ".keyboard")) != NULL) {
- used_nation->n_kmapname = temp;
- used_nation->n_kmap = myKeyMap = FindKeyMap(temp);
- }
- }
-